/*
 * Copyright (c) 2019 , Healthlink All Rights Reserved.
 */

package com.mayday.system.service;

import com.github.pagehelper.PageInfo;
import com.mayday.system.domain.*;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.UserTask;

import java.io.IOException;
import java.util.List;

/**
 * 工作流接口
 *
 * @author lxq
 * @version 1.0
 * @date 2020/4/2 9:56
 * @since JDK 1.8+
 */
public interface ActivitiService {


  /**
   * 中心分页查询流程定义
   * @param queryVo   查询参数
   * @return   中心下的所有流程定义
   */
  PageInfo<ProcessdefVo> queryProcessdefs(ProcessdefQueryVo queryVo);

  /**
   * 根据流程定义id查询最新部署的流程图片信息
   * @param defId  流程定义id
   * @return 图片数据
   * @throws IOException 异常
   */
  byte[] queryProcessdefPngByDefId(String defId) throws IOException;

  /**
   * 新增流程
   * @param flowDef  新增流程对象
   * @return 流程定义id
   */
  String addFlowDef(FlowDef flowDef);

  /**
   * 查询中心所有角色
   * @param systemId 系统id
   * @param centerId 中心id
   * @return 返回角色列表
   */
  List<RoleAndStaffResp> queryRoleByCenterId(String systemId, String centerId);

  /**
   * 查询中心所有职工
   * @param centerId 中心id
   * @return 返回职工列表
   */
  List<RoleAndStaffResp> queryStaffByCenterId(String centerId);

  /**
   * 流程创建、流转
   * @param vo 请求数据
   * @return  UserTaskVo
   * @throws SecurityException 异常处理
   */
  UserTaskVo operaTask(EmdcFlowVo vo) throws SecurityException;

  /**
   * 撤回
   * @param  emdcFlowVo 请求数据
   * @throws SecurityException 异常处理
   * @return boolean
   */
  boolean revoke(EmdcFlowVo emdcFlowVo) throws SecurityException;

  /**
   * 重新提交到被驳回的节点
   * @param emdcFlowVo 请求数据
   * @throws SecurityException 异常处理
   * @return boolean
   */
  UserTaskVo commitReturnNode(EmdcFlowVo emdcFlowVo) throws SecurityException;

  /**
   * 给任务设置操作人员
   * @param taskId 任务id
   * @param list   职工id集合
   */
  void addCandidateUser(String taskId, List<String> list);

  /**
   * 查询与指定staff相关的所有进行中的任务数量[仅支持按流程图查询]
   *
   * @param centerId 中心id
   * @param defKey   流程id [字典]
   * @param staffId  职工id [选填，传null查所有]
   * @return Integer
   */
  Integer queryTaskNumByDefKey(String centerId, String defKey, String staffId);

  /**
   * 查询与指定staff相关的所有进行中的任务数量[仅支持按系统查询]
   *
   * @param centerId 中心id
   * @param systemId 系统id
   * @param staffId  职工id [选填，传null查所有]
   * @return Integer
   */
  Integer queryTaskNumBySystemId(String centerId, String systemId, String staffId);

  /**
   * 查询任务的流转生命周期数据
   *
   * @param businessKey   业务唯一id
   * @return List<EmdcFlowVo>
   */
  List<EmdcFlowVo> queryTaskAround(String businessKey);


  /**
   * 根据业务id查询所有参与过的人
   * @param businessKey  唯一的业务id
   * @return  所有参与过的人
   */
  List<String> queryFlowAllStaffs(String businessKey);

  /**
   * 根据流程定义id查询流程中各个节点的候选人
   * @param defId 流程定义id
   * @return 流程中各个节点的候选人
   */
  List<UserTask> queryAllUserTaskInfo(String defId);

  /**
   * 根据流程定义KEY查询流程定义ID
   * @param key
   * @return
   */
  String queryIdByKey(String key);

  /**
   *  删除任务
   * @param emdcFlowVo
   * @return
   * @throws SecurityException
   */
  Boolean remove(EmdcFlowVo emdcFlowVo) throws SecurityException;

  BpmnModel buildDynamicProcess();
}
